#include "FW.h"

FW_T* FW_t;


//************************************
// Method:    	CALCU_SAMA						//< SAMA运算函数
// Programmer:  duan
// Time:		2019/05/17
// Returns:   	bool							//< 成功：true；失败：false
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	float dt						//< 运算周期
// Parameter: 	bool * DI						//< 数字量输入值数组指针
// Parameter: 	bool * DO						//< 数字量输出值数组指针
// Parameter: 	bool * AI						//< 模拟量输入值数组指针
// Parameter: 	bool * AO						//< 模拟量输出值数组指针
//************************************
bool CALCU_SAMA(FW)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO)
{
	/****************变量定义区开始**************/
	
	
	/*<<<<<定义输入变量>>>>>*/
	float In_Value;
	/*<<<<<定义中间变量>>>>>*/
	float *Lastvalue;
	float*FirstStartFlagFW;
	/****************变量定义区结束**************/

	NAME(FW)* Obj = (NAME(FW)*)arg;



	/****************变量赋值**************/
	
	/*<<<<<输入变量赋值>>>>>*/
	In_Value = AI[0];
	/*<<<<<中间变量赋值>>>>>*/
	Lastvalue = &(Obj->Sta.Last_value);
	FirstStartFlagFW = &(Obj->Sta.FirstStartFlagFW);


	
	
	/**************变量赋值结束************/

	/********************************************/
	/**************算法功能实现开始**************/
	/********************************************/
	
	if ((Lastvalue[0]-In_Value>0.001)|| (Lastvalue[0] - In_Value < -0.001)){  //如果变化大于0.001则将新数写入文件

		if (FirstStartFlagFW[0] >0){       //第一次启动程序时，先不写文件，待一段时间后再写；
			FirstStartFlagFW[0]=FirstStartFlagFW[0]-1;
		}

		else {                      
			FILE* pfilewrited; FILE* pfilewritedb;
			char ID[10] = {};
			sprintf(ID, "%d", Obj->Base.List_Base.ID);
			char countfilepath[40] = COUNTFILE_PATH;
			strcat(countfilepath, ID);                //形成完整的带模块号的路径
			strcat(countfilepath, ".d");
			pfilewrited = fopen(countfilepath, "wb+");  //创建读写权限的.d新文件
			strcat(countfilepath, "b");
			pfilewritedb = fopen(countfilepath, "wb+"); //创建读写权限的.db新文件
			void * Value = &In_Value;

			fwrite(Value, sizeof(float), 1, pfilewrited);  //给.d文件写值
			fclose(pfilewrited);

			fwrite(Value, sizeof(float), 1, pfilewritedb); //给.db文件写值
			fclose(pfilewritedb);
			Lastvalue[0] = In_Value;
		}
		
	}



	/********************************************/
	/**************算法功能实现结束**************/
	/********************************************/	
	return true;
}



////************************************
//// Method:    	BCPARA							//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
//// Programmer:  lww
//// Time:		2018/11/16
//// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
//// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
//// Parameter: 	void ** Data					//< 广播SAMA参数的数据包的指针
////************************************
//int BC_PARA(FW)(Model_Base_t* arg, void** Data)
//{
//	NAME(FW)* Obj = (NAME(FW)*)arg;
//	BC_PARA_PUBLIC(Obj);
//	return 0;
//}



//************************************
// Method:    	BAK_STA							//< 备份SAMA运算中间参数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 指定模块类型链表的指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int BAK_STA(FW)(Model_Base_t* arg, void** Data)
{
	NAME(FW)* Obj = (NAME(FW)*)arg;
	BAK_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	ANA_STA							//< 解析备份的SAMA运算中间参数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回解析字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int ANA_STA(FW)(Model_Base_t* arg, void** Data)
{
	int _iLen = 0;
	NAME(FW)* Obj = (NAME(FW)*)arg;
	//< ANA_STA_PRIVATE(Obj);
	if (Obj != NULL)
		MEMREAD(Obj->Sta, Data[0]);
	return _iLen;
}



////************************************
//// Method:    	CHANGE_PAR				//< 在线修改模块参数函数
//// Programmer:  lww
//// Time:		2018/11/16
//// Returns:   	int						//< 读取字节长度计数值
//// Parameter: 	Model_Base_t* arg		//< 指定模块类型链表的指针
//// Parameter: 	void** Data				//< 存放数据包当前指针位置的地址
////************************************
//int CHANGE_PAR(FW)(Model_Base_t* arg, void** Data)
//{
//	int _iLen = 0;
//	MEMREAD(((NAME(FW)*)arg)->Par, Data[0]);
//	return _iLen;
//}



//************************************
// Method:    	INIT_STAPAR						//< 初始化模块运算中间参数
// Programmer:  lww
// Time:		2018/11/16
// Parameter: 	Model_Base_t* arg				//< 模块参数结构体指针
//************************************
void INIT_STAPAR(FW)(Model_Base_t* arg)
{
	NAME(FW)* name = (NAME(FW)*)arg;
	/****************初始化中间变量结构体**************/
	memset(&(name->Sta), 0, sizeof(name->Sta));
	name->Sta.FirstStartFlagFW=60;
	/**************初始化中间变量结构体结束************/

	/****************对中间变量结构体的相关参数进行赋值**************/

	/**************对中间变量结构体的相关参数进行赋值结束************/
}
